home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Development / PowerD / alpha / examples / tb.d < prev    next >
Encoding:
Text File  |  2002-10-28  |  2.7 KB  |  104 lines

  1. DEF Note[16]=[24,23,19,17,19,7,21,22,10,20,8,18,17,8,20,12]:UBYTE
  2. DEF NoteLength[16]=[1,1,1,1,1,1,1,1,2,1,1,1,2,1,1,1]:UBYTE
  3. DEF Accent[16]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]:UBYTE
  4. DEF Slide[16]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]:UBYTE
  5. ENUM DEST
  6.  
  7.  
  8. PROC main()(INT)
  9.  
  10.   DEF rda,args:PTR TO LONG,output
  11.   DEF tot=0:INT,out=0:INT,notenum=0:INT
  12.   DEFF vco2=0,vco=1.0,vcophase=0,vcofreq=1,lastvcofreq=0,vcoadd,vcofreq2=0
  13.   DEFF hig=0,mid=0,low=0,freq=0,hig2=0,mid2=0,low2=0
  14.   DEFF reso=0.05,feedbk,flevel=0.01,amp=0.0,inp,sq=0.0
  15.   DEF emode=2:INT,filesize=32000:INT
  16.   args:=[NIL]
  17.  
  18.   IF rda:=ReadArgs('DEST/A',args,NIL)
  19.     IF output:=Open(args[DEST],NEWFILE)
  20.       REPEAT // or 39147 ? or 90000 ?
  21.         IF vco > 0
  22.           vco2 := vco2 + (vco - vco2) * 0.95
  23.         ELSE
  24.           vco2 := vco2 + (vco - vco2) * 0.9
  25.         ENDIF
  26.         inp:=vco2
  27.         IF Slide[notenum]
  28.           vcofreq2 := vcofreq2 + (vcofreq - vcofreq2) * 0.002
  29.         ELSE
  30.           vcofreq2 := vcofreq
  31.         ENDIF
  32.         IFN vcofreq2 = lastvcofreq
  33.           vcoadd := Pow(2.0, vcofreq2 - 0.37) // WAS: +0.35 ???
  34.         ENDIF
  35.         lastvcofreq := vcofreq2
  36.         vcophase += vcoadd
  37.         IF vcophase >= 256
  38.           vcophase -= 256
  39.           vco := -vco
  40.         ENDIF
  41.         IF (tot \ 2000) = 0
  42.           vcofreq := Note[notenum] / 12.0
  43.         ENDIF
  44.         freq := 0.08 + 0.8 * amp
  45.         // reso *= 0.99995 ???
  46.         feedbk := reso * mid
  47.         IF feedbk > flevel
  48.           sq:=(feedbk-flevel)*2.0
  49.           feedbk += sq*sq
  50.         ELSEIF (feedbk < -flevel)
  51.           sq:=(feedbk+flevel)*2.0
  52.           feedbk -= sq*sq
  53.         ENDIF
  54.         hig := inp - feedbk - low
  55.         mid += hig*freq
  56.         low += mid*freq
  57.         hig2 := low - 1 * mid2 - low2
  58.         mid2 += hig2*freq
  59.         low2 += mid2*freq
  60.         IF (tot \ 2000) = 0
  61.           IF NoteLength[notenum] = 1
  62.             emode:=0
  63.           ENDIF
  64.         ENDIF
  65.         IF (tot \ 2000) = 1100
  66.           IFN (NoteLength[(notenum+1)] \ 16) = 2
  67.             emode:=2
  68.           ENDIF
  69.         ENDIF
  70.         SELECT emode
  71.           CASE 0
  72.             amp := amp*1.1 + 0.01
  73.             IF amp >= 1.0
  74.               amp:=1.0
  75.               emode:=1
  76.             ENDIF
  77.           CASE 1
  78.             amp := amp * 0.9998
  79.           CASE 2
  80.             amp := amp * 0.99
  81.         ENDSELECT
  82.         out := low * amp * 40
  83.         IF out>127 THEN out:=127
  84.         IF out<-128 THEN out:=-128
  85.         Out(output,out)
  86. //        Write(output,out,1)
  87.         tot++
  88.         IF (tot \ 2000) = 1999
  89.           notenum++
  90.           IF notenum >= 16
  91.             notenum:=0
  92.           ENDIF
  93.         ENDIF
  94.       UNTIL tot >= filesize
  95.       Close(output)
  96.     ELSE
  97.       PrintF('Can''t open file!\n')
  98.     ENDIF
  99.   ELSE
  100.     PrintF('I need a destination!\n')
  101.     Exit(10)
  102.   ENDIF
  103. ENDPROC
  104.